package com.itany.corejava.code16_反射;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月18日 15:03
 */
public class Test05_Method {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class c = User.class;

        //1.获取当前类以及祖先类所有public修饰的方法
        Method[] methods = c.getMethods();
        System.out.println(Arrays.toString(methods));


        // 2.获取当前类中的所有方法，不区分修饰符
        Method[] delaredMethods = c.getDeclaredMethods();
        System.out.println(Arrays.toString(delaredMethods));


        // getMethod(String name, Class<?>... parameterTypes)
        // 获取当前类以及其祖先类中指定参数的public修饰的方法
        // name: 方法名
        // parameterTypes: 方法的参数列表


        // 3.获取当前类以及其祖先类中指定参数的public修饰的方法
        Method sumMethod = c.getMethod("sum", int.class, int.class);
        System.out.println(sumMethod);

        //无法访问private修饰的方法
        // Method addMethod=c.getMethod("add",double.class,double.class);
        // System.out.println(addMethod);

        // 4.获取当前类中任意方法，不区分修饰符
        Method addMethod = c.getDeclaredMethod("add", double.class, double.class);
        System.out.println(addMethod);

        //无法访问父类的方法
        // Method reduceMethod=c.getDeclaredMethod("reduce",int.class,int.class);
        // System.out.println(reduceMethod);

        System.out.println(sumMethod.getName());//获取方法的方法名称
        System.out.println(addMethod.getName());

        User user = new User();
        int sum = (int) sumMethod.invoke(user, 1, 2);
        System.out.println(sumMethod.getName() + "方法执行成功，方法的返回值为:" + sum);

        //无法执行private修饰的方法，需要取现权限检查
        addMethod.setAccessible(true);
        double sum2 = (double) addMethod.invoke(user, 8.0, 10.0);
        System.out.println(addMethod.getName() + "方法执行成功，方法的返回值为:" + sum2);


    }
}
